perm filename PPK.FAI[HAK,HPM]3 blob sn#290151 filedate 1977-06-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00010 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	PPK
C00003 00003	START:	MOVE C,[-1,,[015000,,D]]
C00005 00004		MOVE	A,LINN
C00006 00005	BEG2A:	MOVEM	A,LINN
C00010 00006	LINED:	MOVE DAT,@LEENT		 append line editor
C00013 00007	LFEND:	SKIPN	NEEDLF		check if last line had lf
C00015 00008	DISP1:	MOVEI	C,0
C00018 00009	RCHNW:	MOVE C,[700,,WRD-1]
C00019 00010	APNT:	(A).		RH GETS CLOBBERED AT SETPR2 TIME
C00029 ENDMK
C⊗;
	TITLE	PPK
	A←1
	B←2
	C←3
	D←4
	E←5
	f←6
	ppos← 7
	pnt←10
	len←11
	NLFS←12
	spos←13
	DAT←14
	CB←T←15
	TT←16
	P←17

	LPDL←←69
	BFSZ←←10000

	SYSTOP←←265
	CHKBEG←←223
        LEBUF←←330	;Displacement of actual line editor buffer from beginning of dpy hdr
	LINK←←65	;displacement in PP of link to next PP (DPYSER)

	DPYBUF←←1235	;(from E)
	BOTSTR←←4120	;(from E)
	DPYBSZ←←2450	;(from E)
START:	MOVE C,[-1,,[015000,,D]]
	TTYSET C,		;get display height in D
	SUBI   D,2		;-2 for who line
	MOVEM  D,DPYHT
	SETZM	EMODE
	SETOM	LINN
BEG:	MOVE P,[-LPDL,,PDL]

	MOVEI	A,LEBUF
	PEEK	A,
	MOVEM A,DLEBUF		;Displacement of editor buffer from dpy hdr addr

	MOVEI A,CHKBEG
	PEEK A,
	MOVEM A,CCHKBEG
	LSH A,-9                ;# LO PIECE PAGES
	MOVEI B,SYSTOP
	PEEK B,
	PEEK B,
	MOVE C,CCHKBEG
	SUB C,B
	MOVEM C,CBMST		;CHKBEG-SYSTOP
	LSH B,-9+5              ;STARTING HI PIECE PAGE # * 40
	ADDI B,10               ;SET 2-PIECE FLAG
	HRL B,A
	GETHI B,
	 JRST 4,.

	MOVE A,400321
	HLRZM A,TBLKPT
	HRRZM A,TPJMP
	MOVE A,400322
	HRRZM A,PPCALL
	MOVE A,400236
	MOVEM A,JBTLIN
	MOVE A,400237
	MOVEM A,LETAB
	MOVE	A,LINN
	JUMPGE	A,BEG2
	OUTSTR	[ASCIZ/Line? /]
NXCH:	INCHWL	A
HACH:	CAIN	A,175
	JRST	[ EXIT ↔ JRST START ]
	CAIN	A,15
	JRST	[  INCHWL
		   EXIT
		  JRST START]
	CAIE	A,11
	CAIN	A,40
	JRST	NXCH
	SUBI	A,60
REELUP:	INCHWL	C
	CAIN	C,15
	 JRST	[INCHRW  T
		JRST    BEG3A]
	LSH	A,3
	ADDI	A,-"0"(C)
	JRST	REELUP
BEG3A:
	PTWR1W	[0 ↔ 10041]  ;generate <brk> line# W
	MOVEI	B,0
	MOVE	C,A
	LSH	C,-6
	ADDI	C,60
	PTWR1W	B
	MOVE	C,A
	LSH	C,-3
	ANDI	C,7
	ADDI	C,60
	PTWR1W	B
	MOVE	C,A
	ANDI	C,7
	ADDI	C,60
	PTWR1W	B
	PTWR1W  [0 ↔ 127]
BEG2A:	MOVEM	A,LINN
BEG2:	ADD	A,LETAB
	MOVEI	B,400000-20(A)
	MOVEM	B,LEENT
	HRRZ 	A,400000-20(A)
	JUMPE	A,[ OUTSTR [ASCIZ/Not in use or not a display.
/]
		  JRST START]

	MOVE T,CBMST
	ADDI T,400000
	HRRM T,APNT
	SUBI T,2
	HRLI T,-20
	MOVSM T,JMPOFF
	ADD A,PPCALL
	HLRZ A,@APNT
	SKIPN EMODE
	JRST NEMODE
	MOVE B,A
	ADDI A,LINK		;go to secondary PP if E mode
	HRRZ A,@APNT
	SKIPN A			;but not if there isn't one
	MOVE A,B
NEMODE:	MOVEI B,1(A)
	ADD B,TPJMP
	HRLM B,ENDTST
	ADD A,TBLKPT
	HRRZ A,@APNT
	ADD A,APNT
	HRLI A,444400
	MOVEM A,DLISTL
	SETZM CCNT
	MOVNI A,69
	MOVEM A,BLKCNT

	MOVEI A,DLISTL
	SKIPN EMODE
	JRST NEMOD2
	MOVEI A,B
	MOVE B,LINN
	TTYJOB B,
	MOVE C,[-2000,,DPYBUF]
	MOVE D,[XDPYBU]
	JOBRD A,
	HALT .
	MOVE C,[-<BOTSTR+200-DPYBUF-2000>,,DPYBUF+2000]
	MOVE D,[XDPYBU+2000]
	JOBRD A,
	HALT .
	MOVEI A,DLIST
NEMOD2:	MOVEM A,DLISTP
	HRRZ A,(A)
	HRLI A,444400
	MOVEM A,WRDP

	MOVEI F,0
	MOVEI NLFS,0
	MOVEI LEN,0
	MOVE PNT,[POINT 7,PPAGE+2]
LF1:	PUSHJ P,RCH
	JRST LINED
	CAIN C,12
	JUMPE F,[ MOVEI C,40
		  IDPB C,PNT
		  MOVEI C,15
		  IDPB C,PNT
		  MOVEI C,12
		  IDPB C,PNT
		  ADDI LEN,3
		  ADDI NLFS,1
		  JRST LF1]
	MOVE F,C
	SUBI F,12
        IDPB C,PNT
	CAIN C,12
	JRST [ADDI NLFS,1
	      AOJA LEN,LF1]
        AOJA LEN,LF1
	MOVEM	F,NEEDLF#
LINED:	MOVE DAT,@LEENT		; append line editor
	SKIPN DAT
	JRST LFEND
	ADD DAT,DLEBUF		;Point to buffer itself
	HRRZ CB,CCHKBEG		;BREAK IN NON-SHUFFLING SYSTEM
	CAIGE CB,(DAT)		;PAST BREAK IN SYSTEM?
        ADD DAT,CBMST		;ADD CHKBEG-SYSTOP
	ADDI DAT,400000		;I CONTAINS RELOCATION OF SYSTEM
	MOVE F,DAT		;Make copy of pointer for depositing
	MOVEI A,1
LIE:	TDNE A,(DAT)		;Is this a text word?
	AOJA DAT,LIE		;Yes
CNTDN:	CAMN F,DAT
	JRST LFEND		;Empty line editor
	HRLI F,440700
	SUBI DAT,1		;Point to last real text word in buffer
	HRLI DAT,100700		;Byte pointer to char before EOLCHR in buffer

	MOVEM LEN,SAVLEN#	;in case LE ends with crlf(ie its been sent),
	MOVEM PNT,SAVPNT#	;save len and pnt so we can back up

LECS:	CAMN F,DAT		;check if end overstepped
	JRST LFOO
	ILDB C,F
	CAIE C,177
	CAIN C,14		;stop on funny characters
	JRST LFOO
	CAIE C,13
	CAIN C,0
	JRST LFOO
	CAIE C,15		;if line ends in <cr> or <lf>
	CAIN C,12		;its already been sent, dont dpy it
	JRST BACKUP
	CAIN C,175
	JRST BACKUP
	IDPB C,PNT		;normally, deposit
	AOJA LEN,LECS		;and account

LFOO:	SETOM	NEEDLF		;we didn't insert crlf
	JRST	LFEND

BACKUP:	SKIPN	EMODE		;if E mode, don't ever flush line editor
	JRST	BACKPU
	CAIE	C,12
	SETOM	NEEDLF
	JRST	LFEND
BACKPU:	MOVE	PNT,SAVPNT		;restore depositing byte pntr
	MOVE	LEN,SAVLEN		;and character cnt
LFEND:	SKIPN	NEEDLF		;check if last line had lf
	JRST	LFDONE		;if so, don't add extra one
	MOVEI	C,40
	IDPB	C,PNT		;otherwise add space cr lf
	MOVEI	C,15
	IDPB	C,PNT
	MOVEI	C,12
	IDPB	C,PNT
	ADDI	LEN,3
	ADDI	NLFS,1
LFDONE: SKIPLE	DPYHT		;if not a display, type out whole buffer
	CAMN	NLFS,DPYHT	;if just right number of lines
	JRST	DISP1		;display immediately
	CAML	NLFS,DPYHT	;if too few
	JRST	SQUISH
SPLOO:	MOVEI	C,40		;add blank lines
	IDPB	C,PNT
	MOVEI	C,15
	IDPB	C,PNT
	MOVEI	C,12
	IDPB	C,PNT
	ADDI	LEN,3
	ADDI	NLFS,1
	CAMGE	NLFS,DPYHT
	JRST	SPLOO
	JRST	DISP1	

SQUISH: MOVE	A,[POINT 7,PPAGE+2] ;must be too many lines, remove some
SQUASH:	ILDB	C,A
	CAIE	C,12
	JRST	SQUASH
	SUBI	NLFS,1
	CAMLE	NLFS,DPYHT
	JRST	SQUASH
	MOVE	PNT,[POINT 7,PPAGE+2]
	SETZ	LEN,
SQUOSH:	ILDB	C,A
	IDPB	C,PNT
	ADDI	LEN,1
	CAIE	C,12
	JRST	SQUOSH
	SOJG	NLFS,SQUOSH

	MOVE	NLFS,DPYHT
DISP1:	MOVEI	C,0
	REPEAT  10,{IDPB C,PNT}
	movei c,6(len)			;find number of words for string
	idivi c,5
	addi c,3+1
	hrrm c,buffpt+1

	movni a,1
	getlin a			;get type of terminal
	TLNE A,40000
	JRST [MOVE B,DMAGE		;its a DM
	      MOVEM B,PPAGE
	      MOVE  B,DMAGE+1
              MOVEM B,PPAGE+1
              JRST GIOT]
	tlne a,20000
	JRST [MOVE B,DDAGE		;its a DD
	      MOVEM B,PPAGE
	      MOVE  B,DDAGE+1
              MOVEM B,PPAGE+1
              JRST GIOT]
	TLNE A,400000
	JRST [MOVE B,IIAGE		;its a III
	      MOVEM B,PPAGE
	      MOVE  B,IIAGE+1
              MOVEM B,PPAGE+1
	      PGACT 400000
	      DPYPOS -1000
              JRST GIOT]

	JRST [outstr	PPAGE+2			;not a dd - let outstr handle it.
	      JRST	PRTD]

GIOT:	UPGIOT	BUFFPT
	SETOM	PPAGE-1(C)		;set low order bit (DD UPG's clobber it)

PRTD:	MOVEI	A,1
	SLEEP	A,
	MOVE	A,LINN
	INCHRS	B
	JRST	BEG
	CAIN	B,175
	JRST	ALOU
	CAIN	B,15
	JRST	[INCHRW	B
	  ALOU:	RESET
		PTWR1W [0 ↔ 10041]      ;<brk>P to reset page pr.
		PTWR1W [0 ↔ 120]
		PTWR1W [0 ↔ 10042]      ;<esc>W to get own wholine.
		PTWR1W [0 ↔ 127]
		MOVEI A,1
		SLEEP A,
		EXIT
		JRST START]
	CAIE	B,"E"
	CAIN	b,"e"
	JRST	[SETOM EMODE		;Set E mode
		 JRST BEG]
	CAIE	B,"N"
	CAIN	b,"n"
	JRST	[SETZM EMODE		;Clear E mode - back to normal
		 JRST BEG]
	MOVE	A,B
	JRST	HACH
RCHNW:	MOVE C,[700,,WRD-1]
	MOVEM C,CHRP
	MOVEI C,5
	MOVEM C,CCNT
RCHNW2:	ILDB C,WRDP
	TRNN C,1
	JRST RCHNB
	MOVEM C,WRD
RCH:	SOSGE CCNT
	JRST RCHNW
	ILDB C,CHRP
	JUMPE C,RCH
	AOS (P)
CPOPJ:	POPJ P,

RCHNB:	MOVE A,DLISTP
	CAIN A,DLISTL
	JRST RCHNC		;jump if looking at plain old PP
	HLRZ A,(A)		;max WRDP
	HLL A,WRDP
	CAML A,WRDP
	JRST RCHNW2		;max ≤ WRDP, keep going
	AOS A,DLISTP
	HRRZ A,(A)
	HRLI A,444400
	MOVEM A,WRDP
	JRST RCHNW2

RCHNC:	CAMN C,ENDTST
	POPJ P,
	ADD C,JMPOFF
	TRNN C,-1
	AOSLE BLKCNT
	POPJ P,
	HLRM C,WRDP
	JRST RCHNW2
APNT:	(A).		;RH GETS CLOBBERED AT SETPR2 TIME
WRD:	0↔-1
ENDTST:	20

IBUF:	BLOCK	3
OBUF:	BLOCK	3
ENTR:	BLOCK	4
FILE:	BLOCK	4
PDL:	BLOCK LPDL

	EXIT

JBTLIN:	0
LETAB:	0
PPCALL:	0
TPJMP:	0
TBLKPT:	0
DPYHT:	0

LINN:	0
CHRP:	0
BLKCNT:	0
CCNT:	0
WRDP:	0
JMPOFF:	0
LEENT:	0
CBMST:	0
DLEBUF:	0
CCHKBEG: 0
EMODE:	0				;nozero if in E mode

DLISTP:	0
DLIST:
	XDPYBU+DPYBSZ-1,,XDPYBU		;for E body
DLISTL:	0				;for PP
	0				;for E header
	0				;for E tail

buffpt:	200000,,PPAGE			;double field mode
	0
	0
	PPAGE+1

ersbuf:	BYTE (8) 17,0,46 (3) 1,2,1,4	;funct. code, chan select, funct. code
	0
erspt:	ersbuf
	erspt-ersbuf
	0
	0

DDAGE:	BYTE (8) 46,0,46 (3) 1,2,1,4
	BYTE (8) 2,1,10 (3)3,4,5,4

DMAGE:	BYTE (7) 177,30,177,30,177
	BYTE (7) 30,177,14,140,142

IIAGE:	BYTE (11) -1000,700 (3) 0,0 (1) 0,1 (2) 2 (4) 6
	BYTE (11) -1000,700 (3) 0,0 (1) 0,1 (2) 2 (4) 6

PPAGE:	BYTE (8) 46,0,46 (3) 1,2,1,4
	BYTE (8) 2,1,10 (3)3,4,5,4
	REPEAT	BFSZ,{1}

XDPYBU:	BLOCK	<BOTSTR+200-DPYBUF>

	END START